package sv.com.globalsolutionslt.manejador;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.jasypt.util.password.BasicPasswordEncryptor;

import sv.com.globalsolutionslt.controlador.UsuarioFacade;
import sv.com.globalsolutionslt.entidades.Empresa;
import sv.com.globalsolutionslt.entidades.Persona;
import sv.com.globalsolutionslt.entidades.Usuario;
import sv.com.globalsolutionslt.manejador.util.JsfUtil;

@ManagedBean
@SessionScoped
public class UsuarioSesionMB {

    @EJB
    private UsuarioFacade usuarioFacade;

    private Usuario usuario;
    private Persona persona;
    private Empresa empresa;
    private String nombreUsuario;
    private String contrasenia;
    private String confirmarContrasenia = "";
    private String nuevaContrasenia = "";
    private String actualContrasenia = "";

    private static final String urlPagina = "index.xhtml";
    public final String ROL_ADMINISTRADOR = "ADMINISTRADOR";
    public final String ROL_CANDIDATO = "CANDIDATO";
    public final String ROL_EMPRESA = "EMPRESA";
    private final String CADENA_VALIDACION_ROL = "Para iniciar sesión debe ingresar desde el inicio de sesión para %s en la opción %s";

    public UsuarioSesionMB() {

    }

    public void loginUsuario() {
        try {
            
            String paginaPeticion = FacesContext.getCurrentInstance().getExternalContext().getRequestServletPath();
            
            
            usuario = usuarioFacade.validarAcceso(nombreUsuario, contrasenia);
            if (usuario != null && usuario.getIdUsuario() > 0) {
                if(usuario.getIdRol().getNombre().toUpperCase().contains(ROL_EMPRESA) && paginaPeticion.contains("sesionEmpresa")){
                    setEmpresa(usuario.getEmpresaList().get(0));
                    redireccionarPagian(urlPagina);
                }
                else if(usuario.getIdRol().getNombre().toUpperCase().contains(ROL_CANDIDATO) && paginaPeticion.contains("sesionCandidato")){
                    setPersona(usuario.getPersonaList().get(0));
                    redireccionarPagian(urlPagina);
                }
                else if(usuario.getIdRol().getNombre().toUpperCase().contains(ROL_ADMINISTRADOR))
                    redireccionarPagian(urlPagina);
                
                else{
                    if(usuario.getIdRol().getNombre().equals(ROL_EMPRESA))
                        JsfUtil.agregarMensajeAdvertencia(String.format(CADENA_VALIDACION_ROL, "Empresa","Empresa"));
                    if(usuario.getIdRol().getNombre().equals(ROL_CANDIDATO))
                        JsfUtil.agregarMensajeAdvertencia(String.format(CADENA_VALIDACION_ROL, "Candidato","Candidato"));
                    this.usuario=null;
                }
                
            } else {
                JsfUtil.agregarMensajeAdvertencia("Usuario o contraseña invalidos");
            }
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.agregarMensajeError("Ha ocurrido un error al ingresar");
        }
    }

    public void redireccionarPagian(String url) {
        try {
            System.out.println("Redireccionando a pagina de inicio");
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            String ctxPath = ((ServletContext) context.getContext()).getContextPath();
            String redirect = "";
            redirect = ctxPath + "/" + url;
            context.redirect(redirect);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String cambioClave() {
        try {
            if (!esClaveCorrecta()) {
                JsfUtil.agregarMensajeAdvertencia("La Contraseña actual no es correcta");
                return "";
            }

            if (!esConfirmacionCorrecta()) {
                JsfUtil.agregarMensajeAdvertencia("La Contraseña no coincide con la confirmación");
                return "";
            }
            this.usuario.setContrasenia(new BasicPasswordEncryptor().encryptPassword(getNuevaContrasenia()));
            this.usuarioFacade.modificar(usuario);
            JsfUtil.agregarMensajeExitoso("Su contraseña ha sido cambiada exitosamente");
            return "/index";
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.agregarMensajeError(JsfUtil.MENSAJE_ERROR_DEFECTO);
            return "";
        }
    }

    private boolean esClaveCorrecta() {
        return new BasicPasswordEncryptor().checkPassword(getActualContrasenia(), getUsuario().getContrasenia());
    }

    private boolean esConfirmacionCorrecta() {
        return getNuevaContrasenia().equals(getConfirmarContrasenia());
    }

    public String logOut() {
        usuario = null;
        persona = null;
        empresa = null;
        return "/index.xhtml?faces-redirect=true";
    }

    public boolean isUsuarioEnSesion() {
        return this.usuario != null;
    }

    public boolean isUsuarioAdministrador() {
        return this.usuario != null && this.usuario.getIdRol().getNombre().toUpperCase().contains(ROL_ADMINISTRADOR);
    }

    public boolean isUsuarioCandidato() {
        return this.usuario != null && this.usuario.getIdRol().getNombre().toUpperCase().contains(ROL_CANDIDATO);
    }

    public boolean isUsuarioEmpresa() {
        return this.usuario != null && this.usuario.getIdRol().getNombre().toUpperCase().contains(ROL_EMPRESA);
    }

    //********************* Getter and Setters ***********************
    public String getContrasenia() {
        return contrasenia;
    }

    public void setContrasenia(String contrasenia) {
        this.contrasenia = contrasenia;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public String getConfirmarContrasenia() {
        return confirmarContrasenia;
    }

    public void setConfirmarContrasenia(String confirmarContrasenia) {
        this.confirmarContrasenia = confirmarContrasenia;
    }

    public String getActualContrasenia() {
        return actualContrasenia;
    }

    public void setActualContrasenia(String actualContrasenia) {
        this.actualContrasenia = actualContrasenia;
    }

    public String getNuevaContrasenia() {
        return nuevaContrasenia;
    }

    public void setNuevaContrasenia(String nuevaContrasenia) {
        this.nuevaContrasenia = nuevaContrasenia;
    }

}
